Loca7 · {appartmentTitle(appart)}
{#if reportSubmitted}

Votre signalement a bien été envoyé

{/if} {#if appart.archived}

Cette annonce est archivée

Supprimer { await fetch(`/appartements/${appart.number}/publier`, { method: 'POST' }); appart.archived = false; appart.approved = user?.admin ?? false; }}>Publier
{/if} {#if hasPendingModifications || !appart.approved}

Cette annonce {#if !appart.approved}n'a pas encore été approuvée{/if} {#if hasPendingModifications && !appart.approved}et{/if} {#if hasPendingModifications} a des modifications en attente{/if}

{#if !user?.admin}

En attente de validation par un·e administrateur·ice

{/if} {#if hasPendingModifications || (user?.admin && !appart.approved)}
{#if hasPendingModifications} Voir les modifications {/if} {#if !appart.approved && user?.admin} Supprimer { await fetch(`/appartements/${appart.number}/publier`, { method: 'POST' }); window.location.reload(); }}>Approuver {/if}
{/if}
{/if}

{DISPLAY_APPARTMENT_KIND[appart.kind]}

{#if appart.surface}

{appart.surface}m²

{/if}

{appart.rent}€

{appart.charges}€

{appart.deposit}€

{appart.address} {#if appart.latitude && appart.longitude} à {distanceDisplay(distanceBetween(appart, ENSEEIHT))} de l'école {/if}

Maps
{#if Object.entries(appart.travelTimeToN7).some(([k, v]) => k !== 'id' && v !== null)}

L'école est à
{#if appart.travelTimeToN7.byFoot !== null} {durationDisplay(appart.travelTimeToN7.byFoot)} à pied {/if}
{#if appart.travelTimeToN7.byBike !== null} {durationDisplay(appart.travelTimeToN7.byBike)} à vélo {/if}
{#if appart.travelTimeToN7.byPublicTransport !== null} {durationDisplay(appart.travelTimeToN7.byPublicTransport)} en transports {/if} {#if appart.nearbyStations.length > 0} {#each appart.nearbyStations.sort((a, b) => hexToHsl(a?.color ?? '#000').hue - hexToHsl(b?.color ?? '#000').hue) as station (station.id)} {station.line} {/each} à proximité {/if}

{:else if appart.longitude && appart.latitude}
{ await fetch(`/appartements/${appart.id}/generate-travel-times`); window.location.reload(); }}>Obtenir les temps de trajet
{/if} {#if appart.availableAt.valueOf() >= Date.now()}

{availableAtSentence(secondsAvailableSince, appart.availableAt)} {#if secondsAvailableSince !== 0} {#if secondsAvailableSince > 0}il y a{:else}dans{/if} {durationDisplay(Math.abs(secondsAvailableSince))} {/if}

{/if} {#if appart.surface}

Le prix au mètre carré est de {new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 1 }).format( (appart.charges + appart.rent) / appart.surface )} €/m² (charges comprises)

{/if} {#if appart.likes.length > 0 || liked}

{#if liked} {#if appart.likes.length == 2} Une autre personne est intéréssée par cette annonce {:else if appart.likes.length > 2} {appart.likes.length - 1} autres personnes sont intéréssées par cette annonce {:else} Vous êtes la seule personne intéréssée par cette annonce {/if} {:else if appart.likes.length === 1} Une personne est intéréssée par cette annonce {:else} {appart.likes.length} personnes sont intéréssées par cette annonce {/if}

{/if}
    {#if appart.hasFurniture !== null}
  • {#if !appart.hasFurniture}Non-{/if}Meublé

  • {/if} {#if appart.hasParking}
  • Parking

  • {/if} {#if appart.kind === 'colocation' && appart.roomsCount > 0}
  • {appart.roomsCount}

    Chambres

  • {/if} {#if appart.hasElevator !== null}
  • {#if !appart.hasElevator}Pas d'ascenseur{:else}Ascenseur{/if}

  • {/if} {#if appart.hasBicycleParking}
  • Place pour vélo

  • {/if} {#if appart.hasFiberInternet}
  • Fibre optique

  • {/if}
{#if differenceInMonths(new Date(), appart.availableAt) >= 6}

Cet appartement n'est plus libre?

Si vous avez eu confirmation que l'appartement n'était plus disponible,

Signalez l'annonce comme obsolète.
{/if}
{#if xss(appart.description)}

Description

{@html xss(appart.description)}

{/if}

{#if ownerIsAgency(appart.owner)}Agence{:else}Propriétaire{/if}

{#if ownerIsAgency(appart.owner)} {appart.owner.agencyName} {:else if appart.owner.firstName} {appart.owner.firstName} {appart.owner.lastName.toUpperCase()} {:else} {appart.owner.lastName} {/if}

{#if appart.owner.agencyWebsite} {/if} {#if appart.owner.email && !isGhostEmail(appart.owner.email)}
{appart.owner.email} Envoyer un mail
{/if} {#if appart.owner.phone}
{appart.owner.phone} Appeler
{/if}

{#if user && appart.owner.id !== user?.id}
{ await fetch( `/appartements/${appart.id}/` + (liked ? 'supprimer-like' : 'liker'), { method: 'POST' } ); if (liked) { appart.likes = appart.likes.filter((like) => like.by.id !== user?.id); } else { appart.likes = [ ...appart.likes, { by: user, of: appart, id: null, createdAt: null } ]; } }} icon={liked ? 'heart-filled' : 'heart'} >{liked ? 'Ne plus suivre' : 'Suivre'}
{/if} {#if user?.admin || appart.owner.id === user?.id} Modifier {#if appart?.archived || user?.admin} Supprimer {/if} {#if !appart.approved && user?.admin} { await fetch(`/appartements/${appart.number}/approuver`, { method: 'post' }); appart.approved = true; }}>Approuver {/if} {#if appart.archived} { await fetch(`/appartements/${appart.number}/publier`, { method: 'post' }); appart.archived = false; }}>Publier {:else} { await fetch(`/appartements/${appart.number}/archiver`, { method: 'post' }); appart.archived = true; }}>Archiver {/if} {:else} Signaler {/if}
{#if user?.admin}

Signalements

{/if} {#if user?.admin || appart.owner.id === user?.id}

Modifications en attente

{/if} {#if appart?.latitude && appart?.longitude}
{/if}
Accueil

{#if appart.importedFromOldSite} voir sur l'ancien site •{/if} {#if isNaN(Number($page.params.id))} annonce n°{appart.number} {:else} identifiant de l'annonce: {appart.id} {/if}